package org.chen.payment.util;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import java.util.Map;
import java.util.TreeMap;

public class SignUtil {
    
    /**
     * 生成MD5签名
     * @param params 参数Map
     * @param key 商户密钥
     * @return 签名字符串
     */
    public static String generateMD5Sign(Map<String, Object> params, String key) {
        // 1. 过滤空值和签名参数
        TreeMap<String, Object> sortedParams = new TreeMap<>();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            String paramKey = entry.getKey();
            Object value = entry.getValue();
            
            // 过滤sign、sign_type和空值
            if (!"sign".equals(paramKey) && !"signType".equals(paramKey) && 
                !"sign_type".equals(paramKey) && value != null && 
                StringUtils.hasText(String.valueOf(value))) {
                sortedParams.put(paramKey, value);
            }
        }
        
        // 2. 按ASCII码排序并拼接参数
        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<String, Object> entry : sortedParams.entrySet()) {
            if (!stringBuilder.isEmpty()) {
                stringBuilder.append("&");
            }
            stringBuilder.append(entry.getKey()).append("=").append(entry.getValue());
        }
        
        // 3. 拼接商户密钥
        stringBuilder.append(key);
        
        // 4. MD5加密并转小写
        return DigestUtils.md5DigestAsHex(stringBuilder.toString().getBytes()).toLowerCase();
    }
    
    /**
     * 验证签名
     * @param params 参数Map
     * @param sign 待验证的签名
     * @param key 商户密钥
     * @return 是否验证通过
     */
    public static boolean verifyMD5Sign(Map<String, Object> params, String sign, String key) {
        String generatedSign = generateMD5Sign(params, key);
        return generatedSign.equals(sign.toLowerCase());
    }
}